package cn.lg.soar.core.util.easyexcel.merge;

import org.apache.poi.ss.util.CellRangeAddress;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * excel导出单元格合并策略
 * @author luguoxiang
 * @date 2022-05-07
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
public class MergeStrategy {

    /**
     * 固定配置
     */
    private final List<CellRangeAddress> cellRangeAddressList;
    private final Map<Integer, int[]> rowMergeMap;
    private final Map<Integer, int[]> colMergeMap;

    public MergeStrategy() {
        this.cellRangeAddressList = new ArrayList<>();
        this.rowMergeMap = new HashMap<>(16);
        this.colMergeMap = new HashMap<>(16);
    }

    private MergeStrategy(
            List<CellRangeAddress> cellRangeAddressList,
            Map<Integer, int[]> rowMergeMap,
            Map<Integer, int[]> colMergeMap
    ) {
        this.cellRangeAddressList = cellRangeAddressList;
        this.rowMergeMap = rowMergeMap;
        this.colMergeMap = colMergeMap;
    }

    /**
     * 添加固定合并单元（范围合并）
     * @param firstRow 开始行（包含）
     * @param lastRow 结束行（包含）
     * @param firstCol 开始列（包含）
     * @param lastCol 结束列（包含）
     */
    public void addAddress(int firstRow, int lastRow, int firstCol, int lastCol) {
        cellRangeAddressList.add(new CellRangeAddress(firstRow, lastRow, firstCol, lastCol));
    }

    /**
     * 添加自动行合并（纵向合并）
     * @param col 所在列
     * @param startRow 开始行（包含）
     * @param endRow 结束行（包含）
     */
    public void addAutoRowMerge(int col, int startRow, int endRow) {
        this.rowMergeMap.put(col, new int[]{startRow, endRow});
    }

    /**
     * 添加自动行合并（纵向合并）
     * @param col
     * @param startRow 开始行（包含）
     */
    public void addAutoRowMerge(int col, int startRow) {
        addAutoRowMerge(col, startRow, -1);
    }

    /**
     * 添加自动列合并（横向合并）
     * @param row
     * @param startCol 开始列（包含）
     * @param endCol 结束列（包含）
     */
    public void addAutoColMerge(int row, int startCol, int endCol) {
        this.colMergeMap.put(row, new int[]{ startCol, endCol });
    }

    /**
     * 添加自动列合并（横向合并）
     * @param row 所在行
     * @param startCol 开始列（包含）
     */
    public void addAutoColMerge(int row, int startCol) {
        addAutoColMerge(row, startCol, -1);
    }

    public List<CellRangeAddress> getCellRangeAddressList() {
        return cellRangeAddressList;
    }

    public Map<Integer, int[]> getRowMergeMap() {
        return rowMergeMap;
    }

    public Map<Integer, int[]> getColMergeMap() {
        return colMergeMap;
    }

    /**
     * 创建处理器
     * @return
     */
    public MergeWriteHandler createWriteHandler() {
        return new MergeWriteHandler(this);
    }
}
